<html>
  <head>
    <title>判断平台</title>
  </head>
  <body>
    <script>
      /*
          一、判断平台

                  Native API 具有平台依赖性，所以需要通过以下方式判断当前的运行平台：

                         function judgePlatform(){
                              switch(plus.os,name){
                                  case "Android":
                                      // Android平台： plus.android.*
                                  break;

                                  case "ios":
                                      // iOS平台： plus.ios.*
                                  break;

                                  default:
                                      // 其他平台
                                  break;
                              
                              }
                         }
      */

      /*
          二、类型转换

                  在NJS中调用Native API 或 从 Native API返回数据到NJS时会自动转换数据类型。

                   
                  1、类型转换表

                              类型             Object-c                     Java                                 JS

                              基本数据    byte/short/int/long/float/doublt   byte/short/int/long/float/doublt    Number

                              字符             char                          char                                String

                              字符串           NSString/@""                  String/""                           String

                              数组             @[1,2,3]/NSArray              new XXX[]                           InstanceObject

                              类               @interface                    class                               ClassObject

                              对象             *                              *                                  InstanceObject

                              空对象           nil                            null                               null

                              其他             Protocol                       Interface                          Object(JSON)


                  2、其他转换

                            ①、Android 原生应用的注Acitvity对象，转为 plus.adndroid.runtimeMainActivity()
                               Android的注Activity对象是启动应用时自动创建的，不是代码创建，
                               此时通过plus.adndroid.runtimeMainActivity()方法获取该Activity对象。

                            ②、Objective-C方法冒号剔除 [pos setPositionX:(int)x Y:(int)y;] 转为 pos.setPositionXY(x,y); 
                               OC语法中方法的定义格式为: “(返回值类型) 函数名: (参数1类型) 形参1 参数2名称: (参数2类型) 形参2” 方法的完整名称为: “函数名:参数2名称:”。
                               如:“（void）setPositionX:(int)x Y:(int)y;”，方法的完整名称为“setPositionX:Y:”，调用时语法为：“[pos setPositionX:x Y:y];”。
                               在JS语法中函数名称不能包含“:”字符，所以OC对象的方法名映射成NJS对象方法名时将其中的“:”字符自动删除，上面方法名映射为“setPositionXY”，在NJS调用的语法为：“pos.setPositionXY(x,y);”。


                            ③、文件路径转换Web开发里使用的 image/1.png是该web工程的相对路径，而原生API中经常需要使用绝对路径，
                             
                               比如/sdcard/apptest/image/1.png ，此时使用这个扩展方法来完成转换：  plus.io.convertLoacalFileSystemURL("image/1.png")
      */


      /*
          三、概念

                 1、类对象

                                由于JavaScript本身没有类的概念，为了使用Native API 层的类，在NJS中引入了“类对象(ClassObject)”的概念，

                              用于对Native中的类进行操作，如创建类的示例对象、访问类的静态属性、调用类的静态方法等。

                              其原型如下：

                                    Interface ClassObject{
                                        function Object plusGetAttribute(String name);
                                        function void plusSetAttribute(String name,Object value)
                                    }

                            ★、获取类对象：  在ios平台我们可以通过 plus.ios.importClass(name)方法导入对象，参数name为类的名称；

                                    在android平台我们可以通过 plus.adndroid.importClass(name)方法导入类对象，其参数name为类的名称，

                                    必须包含完整的命名空间。

                                    eg:
                                        //  ios 平台导入NSNotificationCenter类
                                        var NSNotificationCenter = plus.ios.importClass("NSNotificationCenter");

                                        // Android平台导入Intent类
                                        var Intent = plus.android.importClass("android.content.Intent");

                              获取类对象后，可以通过类对象“.”操作符获取类的静态常量属性、调用类的静态方法，类的静态非常量属性需通过plusGetAttribute、plusSetAttribute方法操作


                  2、实例对象

                              在JS中，所有对象都是Object，为了操作Native层类的示例对象，在NJS中引入了"实例对象(InstanceObject)"的概念，

                              用于对Native中的对象进行操作，如果操作对象的属性、调用对象的方法等。

                              其原型如下：

                                      Interface InstanceObject {
                                          function Object plusGetAttribute( String name );
                                          function void plusSetAttribute( String name, Object value );
                                      }

                              ★、获取实例对象： 有两种方式获取类的示例对象，一种是调用Native API 返回值获取，

                                      另一种是通过 new 操作符来创建导入的类对象的实例：如下：

                                      // iOS平台导入NSDictionary类
                                          var NSDictionary = plus.ios.importClass("NSDictionary");
                                      // 创建NSDictionary的实例对象
                                          var ns = new NSDictionary();

                                      // Android平台导入Intent类
                                        var Intent = plus.android.importClass("android.content.Intent");
                                      // 创建Intent的实例对象
                                        var intent = new Intent();


                              获取实例对象后，可以通过实例对象"."操作符获取对象的常量属性、调用对象的成员方法，实例对象的非常量属性

                              则需要通过 plusGetAttribute、plusSetAttribute方法操作。


                3、操作对象的属性和方法

                            ①、常量属性获取对象后就可以通过"."操作符获取对象的常量属性，如果是类对象则获取的是类的静态常量属性，

                               如果是实例对象则获取的是对象的成员常量属性。

                            ②、非常量属性，如果Native层对象的属性值在原生环境下被更改，此时使用"."操作符获取到对应NJS对象的属性值

                               就可能不是实时的属性值，而是该Native层对象被映射为NJS对象那一刻的属性值。为获取Native层独享的实时属性值，

                               需要调用NJS对象的 plusGetAttribute(方法)，参数name为属性的名称，返回值为属性的值。
 
                               调用NJS对象的plusSetAttribute(name,value)方法设置Native层对象的非常量属性值，参数name为属性的名称，value为要设置新的属性值。

                               ★、4注意：  注意：使用plusGetAttribute(name)方法也可以获取Native层对象的常量属性值，但不如直接使用“.”操作符来获取性能高

                            ③、方法

                                  获取对象后可以通过"."操作符直接调用Native层方法，如果是类对象调用的是Native层类的静态方法，

                                如果是实例对象调用的是Native层对象的的成员方法。

                                ★、注意： 在iOS平台由于JS语法的原因，Objective-C方法名称中的“:”字符转成NJS对象的方法名称后将会被忽略，因此在NJS中调用的方法名需去掉所有“：”字符。


                            ④、类的继承

                                  Object-C  和 Java 中类如果存在继承自基类，在NJS中对应的对象会根据继承关系地柜将所有基类的公有方法一一

                                  换成NJS对象的方法，所有基类的公有属性也可以通过其  plusGetAttribute、plusSetAttribute的方法访问。
                            
      */

      /*
          四、开始写NJS

                  使用NJS调用Native API 非常简单，基本步骤如下：

                    ①、导入要使用到的类

                    ②、创建类的示例对象 (或者调用类的静态方法创建)

                    ③、调用实例对象的方法

                ★、以下例子使用NJS调用ios 和 Android的原生弹出提示框(类似但不同于js的alert)

                    1、Android

                                以下代码在Android平台展示调用Native API 显示系统提示框。

                                首先是Android的原生Java代码，用于比对参考：

                                    java：

                                          import android.app.AlertDialog;
                                          //...
                                          // 创建提示框构造对象，Builder是AlertDialog的内部类。参数this指代Android的主Activity对象，该对象启动应用时自动生成
                                              AlertDialog.Builder dlg = new AlertDialog.Builder(this);
                                          // 设置提示框标题
                                              dlg.setTitle("自定义标题");
                                          // 设置提示框内容
                                              dlg.setMessage("使用NJS的原生弹出框，可自定义弹出框的标题、按钮");
                                          // 设置提示框按钮
                                              dlg.setPositiveButton("确定(或者其他字符)", null);
                                          // 显示提示框
                                              dlg.show();
                                          //...

                                    Native.js 代码：

                                          /**
                                           * 在Android平台通过NJS显示系统提示框
                                           *8/
                                          function njsAlertForAndroid(){
                                            // 导入AlertDialog类
                                              var AlertDialog = plus.android.importClass("android.app.AlertDialog");
                                            // 创建提示框构造对象，构造函数需要提供程序全局环境对象，通过plus.android.runtimeMainActivity()方法获取
                                              var dlg = new AlertDialog.Builder(plus.android.runtimeMainActivity());
                                            // 设置提示框标题
                                              dlg.setTitle("自定义标题");
                                            // 设置提示框内容
                                              dlg.setMessage("使用NJS的原生弹出框，可自定义弹出框的标题、按钮");
                                            // 设置提示框按钮
                                              dlg.setPositiveButton("确定(或者其他字符)",null);
                                            // 显示提示框
                                              dlg.show();
                                          }

                                    注意：NJS代码中创建提示框构造对象要求传入程序全局环境对象，可通过plus.android.runtimeMainActivity()方法获取应用的主Activity对象，它是HTML5+应用运行期自动创建的程序全局环境对象。

                    2、IOS

                            以下代码在IOS平台展示调用Native API 显示系统提示对话框。IOS原生Object-C代码，用于比对参考：

                                  object-C 代码：

                                        #import <UIKit/UIKit.h>
                                        //...
                                        // 创建UIAlertView类的实例对象
                                        UIAlertView *view = [UIAlertView alloc];
                                        // 设置提示对话上的内容
                                        [view initWithTitle:@"自定义标题" // 提示框标题
                                            message:@"使用NJS的原生弹出框，可自定义弹出框的标题、按钮" // 提示框上显示的内容
                                            delegate:nil // 点击提示框后的通知代理对象，nil类似js的null，意为不设置
                                            cancelButtonTitle:@"确定(或者其他字符)" // 提示框上取消按钮的文字
                                            otherButtonTitles:nil]; // 提示框上其它按钮的文字，设置为nil表示不显示
                                        // 调用show方法显示提示对话框，在OC中使用[]语法调用对象的方法
                                        [view show];
                                        //...

                                  Native.js代码：

                                        function njsAlertForiOS(){
                                          // 导入UIAlertView类
                                          var UIAlertView = plus.ios.importClass("UIAlertView");
                                          // 创建UIAlertView类的实例对象
                                          var view = new UIAlertView();
                                          // 设置提示对话上的内容
                                          view.initWithTitlemessagedelegatecancelButtonTitleotherButtonTitles("自定义标题" // 提示框标题
                                              , "使用NJS的原生弹出框，可自定义弹出框的标题、按钮" // 提示框上显示的内容
                                              , null // 操作提示框后的通知代理对象，暂不设置
                                              , "确定(或者其他字符)" // 提示框上取消按钮的文字
                                              , null ); // 提示框上其它按钮的文字，设置为null表示不显示
                                          // 调用show方法显示提示对话框，在JS中使用()语法调用对象的方法
                                          view.show();
                                        }



                                  
      */
    </script>
  </body>
</html>